package files;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import de.dnb.basics.applicationComponents.StringUtils;
import de.dnb.basics.applicationComponents.Triplett;

public class RDAInstrumentList {

	/**
	 * Wann beginnt die erste relevante Spalte?
	 */
	public static final int OFFSET = 3;
	public static final int BSZ_EINTRAG = 0 + OFFSET;
	public static final int BSZ_VORZUG = 1 + OFFSET;
	public static final int BAUMANN_LISTE = 2 + OFFSET;
	public static final int GND_ID = 3 + OFFSET;
	public static final int RAK = 4 + OFFSET;
	private static final String[] SPALTEN_UEBERSCHRIFTEN = {
			"Zu erarbeitendes RDA-Vokabular", "RDA-Verweisung",
			"Erläuterungen", "BSZ", "BSZ", "Baumann-Liste", "id", "RAK",
			"IDS (Weibel)", "IDS (Weibel)", "RDA", "RDA" };
	private static Map<String, Triplett<LinkedHashSet<String>, String, String>> map = new TreeMap<String, Triplett<LinkedHashSet<String>, String, String>>();

	/**
	 * Erzeugt eine Tabelle mit 4 Spalten: Suchbegriff, Herkunft des
	 * Suchbegriffs, RAK-Vorzugsbenennung, BSZ-Vorzugsbenennung.
	 * 
	 * @param args
	 * @throws IOException
	 */
	public static void main(final String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(
				new FileReader(
						"C:/Users/baumann.AD-DDB/Downloads/"
								+ "RDA Termini Besetzung _ Gattung - 6.28.1.9.1 + 6.15.1.5. (Besetzung) .tsv"));
		String line;

		for (line = reader.readLine(); line != null; line = reader.readLine()) {
			String[] entries = line.split("\t", -1);
			for (int i = OFFSET; i < entries.length; i++) {
				if (i == GND_ID)
					continue;
				String suchbegriff = entries[i];
				String suchbegriffBer = bereinige(suchbegriff);

				if (!suchbegriffBer.isEmpty()) {
					String herkunft = SPALTEN_UEBERSCHRIFTEN[i];

					// Vorzugsbenennungen nach RAK ermitteln
					String rak = entries[RAK];
					// nicht in Anlage, aber vom DMA verwendet?
					if (bereinige(rak).isEmpty())
						rak = entries[BAUMANN_LISTE];

					// Vorzugsbenennungen nach BSZ
					String bsz = entries[BSZ_VORZUG];
					// wenn leer, dann ist der Eintrag
					// schon die Vorzugsbenennung;
					if (bsz.isEmpty())
						bsz = entries[BSZ_EINTRAG];

					bsz = bereinige(bsz);
					rak = bereinige(rak);
					rak = rak.replaceAll("/.*", "");

					String[] eintraege;
					if (i == RAK)
						eintraege = suchbegriffBer.split("/");
					else {
						eintraege = new String[1];
						eintraege[0] = suchbegriffBer;
					}
					for (String rakString : eintraege) {
						trageTripelEin(rakString, herkunft, rak, bsz);
					}

				}
			}

		}

		gibDatenAus();

	}

	protected static void gibDatenAus() {
		Set<String> keySet = map.keySet();
		for (String string : keySet) {
			Triplett<LinkedHashSet<String>, String, String> triplett = map
					.get(string);
			System.out.println(StringUtils.concatenate("\t", string,
					StringUtils.concatenate(" / ", triplett.first),
					triplett.second, triplett.third));
		}
	}

	protected static void trageTripelEin(String suchbegriff, String herkunft,
			String rak, String bsz) {
		Triplett<LinkedHashSet<String>, String, String> daten = map
				.get(suchbegriff);
		if (daten == null) {
			daten = new Triplett<LinkedHashSet<String>, String, String>(
					new LinkedHashSet<String>(), rak, bsz);
			map.put(suchbegriff, daten);
		}
		LinkedHashSet<String> herkunftsListe = daten.first;
		herkunftsListe.add(herkunft);
	}

	private static String bereinige(final String eintrag) {
		String string = eintrag;
		List<Character> blackList = Arrays.asList('.', '?', '§', ',', '[', ']',
				'\"', '!');
		string = string.replace("(o.B.)", "");
		string = string.replace("(ohne B)", "");
		StringBuffer buffer = new StringBuffer(string);
		for (int i = 0; i < buffer.length(); i++) {
			char currentChar = buffer.charAt(i);
			if (Character.isDigit(currentChar)
					|| blackList.contains(currentChar)) {
				buffer.deleteCharAt(i);
				i--;
			}
		}
		string = buffer.toString();
		string = string.replace("()", "");

		string = string.trim();
		// if(string.isEmpty())
		// System.err.println(eintrag);

		return string.trim();
	}
}
